// 复杂指针：混合了函数指针、数组指针、指针数组的指针
// C语言复杂的函数指针声明: https://www.cnblogs.com/keyblade/p/3681857.html
// 参考1：https://blog.csdn.net/akof1314/article/details/6104901
// 参考2：https://blog.csdn.net/tgvincent/article/details/118967613
// 参考3：https://blog.csdn.net/qq_43205256/article/details/123097791

#include <stdio.h>

int main()
{
    int (*func1)(int *p);

    // 分析: func - 右) - 左* - func是一个指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 查表得指针指向函数,func是一个函数指针,()里的为函数参数,更新当前类型为函数 - 左int - 查表得函数返回值类型为int

    // 结论: func是一个函数指针,指向的函数有一个类型为int*的参数且返回值类型为int.

    int (*func2)(int *p, int (*f)(int *));
    // 分析: func - 右) - 左* - func是指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - func是函数指针,更新当前类型为函数 - 左int - 指向的函数的返回值类型为int
    // 结论: func是一个函数指针,指向的函数返回值类型为int,有2个参数,一个类型为int*,另一个类型为函数指针,指向的函数返回值类型为int且有一个int*类型的参数.

    int (*func3[5])(int *p);
    // 分析: func - 右[ - func为数组,有5个元素,更新当前类型为数组 - 右) - 左* - 数组元素为指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 数组元素为函数指针,更新当前类型为函数 - 左int - 指向的函数返回值类型为int
    // 结论略~

    // 下面的例子省略方向提示,更新当前类型提示,遇括号转向,跳出括号以及结论(手懒,剁

    int (*(*func4)[5])(int *p);
    // 分析: func - * - func是指针 - [ - 指向有5个元素的数组 - * - 数组元素是指针 - ( - 数组元素是函数指针 - int - 指向的函数返回值类型为int

    int(*(*func5)(int *p))[5];
    // 分析: func - * - func是指针 - ( - func是函数指针 - * - 指向的函数返回值类型为指针 - [ - 返回的指针指向有5个元素的数组 - int - 数组元素类型为int

    // int func6(void)[5]; // 错误：不允许使用返回数据的函数
    // 分析: func - ( - func是函数 - int - 返回值类型为int - [ - 返回值类型为有5个int元素的数组

    // int func7[5](void); // 错误：不允许使用函数数组
    // 分析: func - [ - func是数组 - ( - 数组元素是函数 - int - 函数返回值类型为int

    int(*(*func8)[5][6])[7][8];
    // 分析: func - * - func是指针 - [ - func指向有5个元素的数组 - [ - 5元素数组里的每个元素是有6个元素的数组 - * - 6元素数组的每个元素为指针 - [ - 指针指向7元素数组 - [ - 7元素数组的每个元素为8元素数组 - int - 8元素数组元素为int

    int (*(*(*func9)(int *))[5])(int *);
    // 分析: func - * - func是指针 - ( - func是函数指针 - * - 函数返回值为指针 - [ - 返回值指向5元素数组 - * - 5元素数组元素为指针 - ( - 指针为函数指针 - int - 函数返回值为int

    int(*(*func_10[7][8][9])(int *))[5];
    // 分析: func - [ - func是7元素数组 - [ - 7元素数组元素为8元素数组 - [ - 8元素数组元素为9元素数组 - * - 9元素数组元素为指针 - ( - 为函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int

    int(*(*func_11)(int *p))[5];
    // 分析: func - * - func是指针 - ( - 是函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int

    return 0;
}